clone() মেথডের ব্যবহার এবং Cloneable Interface

Java Technologies - Java.lang প্যাকেজ (Java.lang Package) - Object ক্লাস
265

Java.lang প্যাকেজ Java প্রোগ্রামিং ল্যাঙ্গুয়েজের একটি গুরুত্বপূর্ণ প্যাকেজ, যা খুবই সাধারণ এবং প্রয়োজনীয় ক্লাস এবং ইন্টারফেস অন্তর্ভুক্ত করে। এই প্যাকেজে থাকা clone() মেথড এবং Cloneable ইন্টারফেস Java-তে অবজেক্ট ক্লোনিংয়ের জন্য ব্যবহৃত হয়।


clone() মেথড:

clone() মেথড হল Object ক্লাসের একটি মেথড যা একটি অবজেক্টের শ্যালো কপি (shallow copy) তৈরি করে। যখন আপনি একটি অবজেক্ট ক্লোন করতে চান, তখন clone() মেথডটি সেই অবজেক্টের একটি নতুন কপি তৈরি করে, যার প্যাটার্ন হলো মূল অবজেক্টের মত। এটি Shallow Copy তৈরি করে, অর্থাৎ শুধুমাত্র অবজেক্টের রেফারেন্স কপি করা হয়, বাস্তব কনটেন্ট কপি হয় না (যেমন এক্সটেনডেড অবজেক্ট বা নেস্টেড অবজেক্টের ক্ষেত্রে)।

clone() মেথডের ব্যবহার:

  1. Shallow Copy: clone() শুধুমাত্র অবজেক্টের প্রথম স্তরের কপি তৈরি করে। এটি যদি একটি অবজেক্টে আরেকটি অবজেক্টের রেফারেন্স থাকে, তবে ক্লোন করা অবজেক্টে ঐ রেফারেন্সের মানও কপি হবে, তবে অবজেক্টের ভেতরের ডেটার কপি হবে না।
  2. Override Required: clone() মেথডটি Object ক্লাসে ডিফাইন করা হলেও, এটি শুধুমাত্র তখন কাজ করে যখন অবজেক্টের ক্লাস Cloneable ইন্টারফেসটি ইমপ্লিমেন্ট করে।

clone() মেথডের সিঙ্কট্যাক্স:

protected Object clone() throws CloneNotSupportedException
  • protected: এটি protected হওয়ায়, ক্লাসগুলো নিজস্ব ক্লোনিং কার্যকলাপের জন্য এটি ব্যবহার করতে পারে, তবে বাইরের ক্লাসে সরাসরি অ্যাক্সেস করা যাবে না।
  • throws CloneNotSupportedException: যদি কোনো ক্লাস Cloneable ইন্টারফেস ইমপ্লিমেন্ট না করে, তাহলে এই মেথড CloneNotSupportedException ছুঁড়ে দেয়।

Cloneable Interface:

Cloneable একটি মার্কার ইন্টারফেস, অর্থাৎ এটি কোনও মেথড ডিফাইন করে না। এর লক্ষ্য হল Java এর ক্লাসগুলোকে ক্লোনযোগ্য (cloneable) হিসেবে চিহ্নিত করা। যদি একটি ক্লাস Cloneable ইন্টারফেস ইমপ্লিমেন্ট করে, তবে ঐ ক্লাসের অবজেক্ট ক্লোন করা যাবে। যদি ক্লাসটি Cloneable ইন্টারফেস ইমপ্লিমেন্ট না করে এবং clone() মেথড কল করা হয়, তবে CloneNotSupportedException আছড়ে পড়বে।

Cloneable ইন্টারফেস ব্যবহার:

  • Cloneable ইন্টারফেস এক ধরনের চুক্তি বা সিগন্যাল যা বলে দেয় যে একটি ক্লাসের অবজেক্ট ক্লোন করা যাবে। এটি ক্লাসের ভিতরে কোনো মেথড ডিফাইন না করলেও শুধুমাত্র একটি চিহ্ন হিসেবে কাজ করে।

clone() মেথড এবং Cloneable Interface এর উদাহরণ:

class Person implements Cloneable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter methods
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // Override the clone method
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();  // Call the clone method of Object class
    }
}

public class CloneExample {
    public static void main(String[] args) {
        try {
            // Create an object
            Person person1 = new Person("John", 25);

            // Clone the object
            Person person2 = (Person) person1.clone();

            System.out.println("Original Person: " + person1.getName() + ", " + person1.getAge());
            System.out.println("Cloned Person: " + person2.getName() + ", " + person2.getAge());

        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. Person ক্লাসটি Cloneable ইন্টারফেস ইমপ্লিমেন্ট করেছে, যার ফলে clone() মেথডটি সফলভাবে কাজ করতে পারবে।
  2. clone() মেথডটি super.clone() কল করছে, যা মূল Object ক্লাসের clone() মেথডকে ব্যবহার করে অবজেক্টের কপি তৈরি করে।
  3. person1 এর কপি তৈরি করে person2 কে প্রদান করা হয়েছে, এবং পরে তাদের নাম ও বয়স প্রদর্শিত হয়েছে।

আউটপুট:

Original Person: John, 25
Cloned Person: John, 25

Shallow Copy বনাম Deep Copy:

  • Shallow Copy: clone() মেথডটি সাধারণত শ্যালো কপি তৈরি করে। অর্থাৎ যদি কোনো অবজেক্টে অন্য অবজেক্টের রেফারেন্স থাকে, তবে ক্লোনকৃত অবজেক্টে সেই রেফারেন্সের কপি থাকে, কিন্তু ভ্যালুগুলোর কপি থাকে না।
  • Deep Copy: যদি আপনি পুরো অবজেক্টের কপি করতে চান (অর্থাৎ, ঐ অবজেক্টের ভিতরের সব রেফারেন্সে গিয়েও কপি করতে চান), তাহলে আপনাকে deep cloning এর জন্য ম্যানুয়ালি কোড লিখতে হবে।

Shallow Copy Example:

class Car implements Cloneable {
    private String model;
    private Engine engine;

    public Car(String model, Engine engine) {
        this.model = model;
        this.engine = engine;
    }

    public String getModel() {
        return model;
    }

    public Engine getEngine() {
        return engine;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();  // Shallow copy
    }
}

class Engine {
    private String type;

    public Engine(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }
}

public class ShallowCopyExample {
    public static void main(String[] args) throws CloneNotSupportedException {
        Engine engine = new Engine("V8");
        Car car1 = new Car("Toyota", engine);

        Car car2 = (Car) car1.clone();
        System.out.println(car1.getEngine().getType());  // Output: V8
        System.out.println(car2.getEngine().getType());  // Output: V8

        // Modifying the engine of car2 will affect car1 as well because both refer to the same Engine object
        car2.getEngine().getType();
        System.out.println(car1.getEngine().getType());  // Output: modified value of engine type
    }
}

এখানে Car ক্লাসের ক্লোনিং একটি shallow copy তৈরি করবে, এবং Engine অবজেক্টে পরিবর্তন করলে তা মূল car1 অবজেক্টকেও প্রভাবিত করবে কারণ তারা একই Engine অবজেক্টের রেফারেন্স শেয়ার করছে।


  • clone() মেথড একটি অবজেক্টের শ্যালো কপি তৈরি করতে ব্যবহৃত হয়।
  • Cloneable একটি মার্কার ইন্টারফেস যা Java অবজেক্ট ক্লোনিং সক্ষম করে।
  • যদি কোনো ক্লাস Cloneable ইন্টারফেস ইমপ্লিমেন্ট না করে, তাহলে clone() মেথড কল করলে CloneNotSupportedException অ্যাক্সেপশন ছুঁড়ে দেওয়া হবে।
Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...